home *** CD-ROM | disk | FTP | other *** search
/ NOVA - For the NeXT Workstation / NOVA - For the NeXT Workstation.iso / Apps / Utilities / Unix / WhosOnFirst / InfoMgr.m < prev    next >
Text File  |  1992-12-26  |  11KB  |  421 lines

  1. #import "InfoMgr.h"
  2. #import "DefaultMgr.h"
  3. #import "myMainObject.h"
  4. #import <stdlib.h>
  5. #import <libc.h>
  6. #import <appkit/Application.h>
  7. #import <appkit/Window.h>
  8. #import <appkit/View.h>
  9. #import <appkit/Control.h>
  10. #import <appkit/ActionCell.h>
  11. #import <appkit/TextField.h>
  12. #import <appkit/Button.h>
  13. #import <appkit/OpenPanel.h>
  14. #import <appkit/Matrix.h>
  15. #import <sys/param.h>
  16.  
  17. id infoManager;
  18. /*===========================================================================
  19.  
  20.     File: InfoMgr.m
  21.  
  22.     Purpose: This file is not just an infoManager.  It is an 
  23.         Info/Preferences manager.  However, due to the constant 
  24.         revisions (and no real code re-organizations) this file is 
  25.         now the multi-purpose beast that it is.  Re-organization
  26.         may take place at some later date.
  27.  
  28. ===========================================================================*/
  29.  
  30. @implementation InfoMgr
  31.  
  32. - init
  33. {
  34.     [super init];
  35.  
  36.     generalView = infoView;        /* See nib files for this one */
  37.     return self;
  38. }
  39.  
  40. /*===========================================================================
  41.  
  42.     Method: initDefaults
  43.  
  44.     Purpose: To get the defaults from the default manager into instance
  45.          variables and interface objects.
  46.  
  47.     Called: From appDidInit:sender
  48.  
  49. ===========================================================================*/
  50.  
  51. - initDefaults
  52. {
  53.     [speakMessages setStringValue:[defaultManager loginMessage] at:0];
  54.     [speakMessages setStringValue:[defaultManager logoutMessage] at:1];
  55.  
  56.     [whenToSpeak selectCellAt: [defaultManager whenToSpeak] :0];
  57.     [doubleClickAction selectCellAt: [defaultManager doubleClickAction] :0];
  58.  
  59.     [confirmDoubleClick setState:[defaultManager doubleClickConfirm]];
  60.  
  61.     [[speakLog cellAt:0 :0] setState:[defaultManager speakLogin]];
  62.     [[speakLog cellAt:0 :1] setState:[defaultManager speakLogout]];
  63.  
  64.     return self;
  65. }
  66.  
  67. /*===========================================================================
  68.  
  69.     Method: initSpeech: (const char *) dictPath
  70.  
  71.     Purpose: To allocate and initialize the speech object.  
  72.  
  73.     Algorithm: 
  74.         o Allocate and initialize speech object.
  75.         o Set the dictionary ordering to our preference
  76.         o set the Application dictionary path.
  77.  
  78.     NOTE:  The Application Dictionary (WhosOnFirst.preditor) is located
  79.         in WhosOnFirst.app/.  However, because the speech object is
  80.         communicating with a Speech Server, the server has no idea
  81.         where WhosOnFirst.app is located in the directory hierarchy.
  82.         Therefore, the full path to the dictionary file must be
  83.         provided to this method.  Please see myMainObject.m, 
  84.         -appDidInit:sender for more code.  See TextToSpeech Kit
  85.         documentation for a description of the setAppDictPath: 
  86.         method.
  87.  
  88.         Compilation of this method is conditional.  See 
  89.         Makefile.preamble to set up conditional compilation flags.
  90.  
  91. ===========================================================================*/
  92. #ifdef SPEECH
  93.  
  94. - initSpeech:(const char *) dictPath
  95. {
  96. short dictOrder[5] = { TTS_NUMBER_PARSER, TTS_USER_DICTIONARY, TTS_APPLICATION_DICTIONARY,
  97.             TTS_MAIN_DICTIONARY, TTS_LETTER_TO_SOUND};
  98.  
  99.     if (!mySpeech) mySpeech = [[TextToSpeech alloc] init];
  100.     if (mySpeech == nil)
  101.     {
  102.         sleep(5);
  103.         mySpeech = [[TextToSpeech alloc] init];        /* Avoid high load problems */
  104.     }
  105.     if (mySpeech == nil)
  106.     {
  107.         if ([[whenToSpeak selectedCell] tag]!=SPEECHOFF)
  108.         {
  109.             if (NXRunAlertPanel("TextToSpeech","Could not launch TextToSpeech Server", "Disable Speech",
  110.                             "Ignore", NULL)==1) [whenToSpeak selectCellAt: 0 :0];
  111.         }
  112.     }
  113.     else
  114.     {
  115.         [mySpeech setDictionaryOrder: dictOrder];
  116.         [mySpeech setAppDictPath: dictPath];
  117.     }
  118.     return self;
  119. }
  120.  
  121. #endif
  122.  
  123. /*===========================================================================
  124.  
  125.     Method: cleanUp
  126.  
  127.     Purpose: To update the defaults manager in preparation for 
  128.         application termination.
  129.  
  130. ===========================================================================*/
  131. - cleanUp
  132. {
  133. int temp;
  134.  
  135.     temp = [[whenToSpeak selectedCell] tag];
  136.     [defaultManager setWhenToSpeak:temp];
  137.  
  138.     temp = [[doubleClickAction selectedCell] tag];
  139.     [defaultManager setDoubleClickAction:temp];
  140.  
  141.     [defaultManager setLoginMessage: [speakMessages stringValueAt:0]];
  142.     [defaultManager setLogoutMessage: [speakMessages stringValueAt:1]];
  143.  
  144.     [defaultManager setSpeakLogin: (BOOL)[[speakLog cellAt:0 :0] state]];
  145.     [defaultManager setSpeakLogout: (BOOL)[[speakLog cellAt:0 :1] state]];
  146.     
  147.     [defaultManager setDoubleClickConfirm: (BOOL)[confirmDoubleClick state]];
  148.  
  149.  
  150.     return self;
  151. }
  152.  
  153. /*===========================================================================
  154.  
  155.     Method: switchViews:sender
  156.  
  157.     Purpose: To switch the view hierarchy based on the selection of the
  158.         pop-up menu on the info panel
  159.  
  160. ===========================================================================*/
  161.  
  162. - switchViews:sender
  163. {
  164.     [window disableFlushWindow];
  165.     [generalView removeFromSuperview];
  166.     switch ([[sender selectedCell] tag])
  167.     {
  168.         case 0:
  169.             [[window contentView] addSubview:infoView];
  170.             generalView = infoView;
  171.             break;
  172.         case 1:
  173.             [[window contentView] addSubview:speechView];
  174.             generalView = speechView;
  175.             break;
  176.         case 2:
  177.             [[window contentView] addSubview:speechControlView];
  178.             generalView = speechControlView;
  179.             break;
  180.         case 3:
  181.             [[scrollView docView] display];
  182.             [[window contentView] addSubview:iconInfoView];
  183.             generalView = iconInfoView;
  184.             break;
  185.         case 4:
  186.             [[window contentView] addSubview:TextToSpeechView];
  187.             generalView = TextToSpeechView;
  188.             break;
  189.         case 5:
  190.             [[window contentView] addSubview:LicenceView];
  191.             generalView = TextToSpeechView;
  192.             break;
  193.     }
  194.     [[window contentView] display];
  195.     [window reenableFlushWindow];
  196.     [window flushWindow];
  197.  
  198.     return self;
  199. }
  200.  
  201. /*===========================================================================
  202.  
  203.     Method: doubleClickEvent
  204.  
  205.     Purpose: An IconView will receive any double click events.  This
  206.         method is here to provide IconView with information about 
  207.         what is to be done in the event of a double click.
  208.  
  209. ===========================================================================*/
  210.  
  211. -(int) doubleClickEvent
  212. {
  213.     return([[doubleClickAction selectedCell] tag]);
  214. }
  215.  
  216. /*===========================================================================
  217.  
  218.     Method: confirmDoubleClick
  219.  
  220.     Purpose: If the user has requested confirmation of Double Click
  221.         events, display a panel with message supplied in the variable
  222.         "message" return the value returned by the panel.
  223.  
  224.         If the user has not requested confirmation of double clicks,
  225.         simply return true.
  226.  
  227. ===========================================================================*/
  228.  
  229. -(int) confirmDoubleClick:(const char *) message
  230. {
  231.  
  232.     if (![confirmDoubleClick state])
  233.         return(1);
  234.     else
  235.         return(NXRunAlertPanel("Double Click Confirmation", message, "Ok", "Cancel", NULL));
  236. }
  237.  
  238. #ifndef SPEECH
  239. - enableSpeech:sender
  240. {
  241.     return self;
  242. }
  243. #endif
  244.  
  245. /*===========================================================================
  246.  
  247.     Compilation of the following methods is conditional.  See 
  248.     Makefile.preamble to set up conditional compilation flags.
  249.  
  250. ===========================================================================*/
  251.  
  252. #ifdef SPEECH
  253.  
  254. - enableSpeech:sender
  255. {
  256. char dictPath[256];
  257. const char *appPath;
  258.  
  259.     if (mySpeech) return self;
  260.     if ([[whenToSpeak selectedCell] tag] != SPEECHOFF)
  261.     {
  262.         appPath = [mainObject appDirectory];
  263.         strcpy(dictPath, appPath);
  264.         strcat(dictPath, "/WhosOnFirst.preditor");
  265.  
  266.         /* Initialize the speech. Include the application dictionary.*/
  267.         [self initSpeech:dictPath];
  268.     }
  269.     return self;
  270. }
  271.  
  272.  
  273. /*===========================================================================
  274.  
  275.     Method:speakLoginMessage
  276.  
  277.     Purpose: Given the user's preference settings, speak the appropriate
  278.         login message.
  279.  
  280. ===========================================================================*/
  281.  
  282. - speakLoginMessage:(const char *) user tty:(const char *) tty host:(const char *) host
  283. {
  284. char tempHostName[MAXHOSTNAMELEN];
  285.  
  286.     if ([[speakLog cellAt:0 :0] state])            /* Speak login messages? */
  287.         switch([[whenToSpeak selectedCell] tag])    /* Get message from info panel */
  288.         {
  289.             case SPEECHOFF:             /* No Speech */
  290.                     break;
  291.  
  292.             case ANYUSER:                /* Speak for any user */
  293.                     [self speakFormatString: [speakMessages stringValueAt:0]
  294.                         name: user tty:tty host:host];
  295.  
  296.                     break;
  297.  
  298.             case OTHERUSERS:            /* Speak for other users */
  299.                     if (strcmp(getlogin(), user))
  300.                         [self speakFormatString: [speakMessages stringValueAt:0]
  301.                             name: user tty:tty host:host];
  302.                     break;
  303.  
  304.             case REMOTEUSERS:             /* Speak for remote users */
  305.                     gethostname(tempHostName, MAXHOSTNAMELEN);
  306.                     if (strcmp(host, tempHostName))
  307.                         [self speakFormatString: [speakMessages stringValueAt:0]
  308.                             name: user tty:tty host:host];
  309.                     break;
  310.  
  311.         }
  312.     return self;
  313. }
  314.  
  315. /*===========================================================================
  316.  
  317.     Method:speakLogoutMessage
  318.  
  319.     Purpose: Given the user's preference settings, speak the appropriate
  320.         logout message.
  321.  
  322. ===========================================================================*/
  323.  
  324. - speakLogoutMessage:(const char *) user tty:(const char *) tty host:(const char *) host
  325. {
  326. char tempHostName[MAXHOSTNAMELEN];
  327.  
  328.     if ([[speakLog cellAt:0 :1] state])            /* Speak logout messages? */
  329.         switch([[whenToSpeak selectedCell] tag])
  330.         {
  331.             case SPEECHOFF:             /* No Speech */
  332.                     break;
  333.  
  334.             case ANYUSER:                /* Speak for any user */
  335.                     [self speakFormatString: [speakMessages stringValueAt:1]
  336.                         name: user tty:tty host:host];
  337.  
  338.                     break;
  339.  
  340.             case OTHERUSERS:            /* Speak for other users */
  341.                     if (strcmp(getlogin(), user))
  342.                         [self speakFormatString: [speakMessages stringValueAt:1]
  343.                             name: user tty:tty host:host];
  344.                     break;
  345.  
  346.             case REMOTEUSERS:            /* Speak for remote users */
  347.                     gethostname(tempHostName, MAXHOSTNAMELEN);
  348.                     if (strcmp(host, tempHostName))
  349.                         [self speakFormatString: [speakMessages stringValueAt:1]
  350.                             name: user tty:tty host:host];
  351.                     break;
  352.  
  353.         }
  354.     return self;
  355. }
  356. /*===========================================================================
  357.  
  358.     Method: SpeakFormatString: format
  359.             name: user
  360.             tty: tty
  361.             host: host
  362.  
  363.     Purpose: Given that a message is to be spoken, get the message format
  364.         string from the info panel and construct a speak message
  365.         which conforms to the format string.
  366.  
  367. ===========================================================================*/
  368.  
  369. - speakFormatString:(const char *) format name:(const char *) user tty:(const char *) tty host:(const char *) host
  370. {
  371. int i, j = 0, k = 0;
  372. char finalString[1024];
  373.  
  374.     bzero(finalString, 1024);
  375.  
  376.     i = strlen(format);
  377.     while(j<i)
  378.     {
  379.         switch(format[j])
  380.         {
  381.             case '%':switch(format[j+1])
  382.                  {
  383.                     /* Insert login name */
  384.                     case 'u': strncat(finalString, user, 8);
  385.                           j+=2;
  386.                           break;
  387.  
  388.                     /* Insert host name */
  389.                     case 'h': strcat(finalString, host);
  390.                           j+=2;
  391.                           break;
  392.  
  393.                     /* Insert tty name */
  394.                     case 't': strcat(finalString, tty);
  395.                           j+=2;
  396.                           break;
  397.  
  398.                     /* A single % sign. */
  399.                     default: finalString[k] = '%';
  400.                          break;
  401.                  }
  402.                  k = strlen(finalString);
  403.                  break;
  404.  
  405.             default: finalString[k++] = format[j++];
  406.                  break;
  407.         }
  408.     }
  409.  
  410.  
  411.     if (!mySpeech) [self enableSpeech:self];
  412.     /* Here we are!  Actually tell the speech object to Speak the message :-) */
  413.     [mySpeech speakText:finalString];
  414.  
  415.     return self;
  416. }
  417.  
  418. #endif
  419.  
  420. @end
  421.